﻿using System;
using System.Collections.Generic;
using System.Text;
using Sora.Data.Models;
using Sora.Data;
using System.Windows.Documents;
using Sora.Data.DataFormatProviders;
using System.IO;
using System.Windows;
using Sora.HelpSystem.Package.DataFormatters;

namespace Sora.HelpSystem.Package.DataObjects
{
    public class CachedFlowDocumentProperty : KeyObject, Sora.HelpSystem.Package.DataObjects.ICachedFlowDocumentProperty
    {
        private FlowDocumentDataFormatProvider FormatProvider { get; set; }

        public CachedFlowDocumentProperty(IEntry key)
            : base(key)
        {
            FormatProvider = new FlowDocumentDataFormatProvider();

            Cache = null;
        }

        private FlowDocument Cache { get; set; }

        /*
         * Chaque FlowDocument fonctionne comme pour l'ui : il ne peut y avoir qu'un seul parent pour chaque élément
         * du fichier, ce qui pose problème lors de l'impression.
         * 
         * Solution, on duplique. On peut librement obtenir une nouvelle copie à partir
         * de la source car chaque modification document est synchronisée avec la BDD
         */
        public FlowDocument GetCopy()
        {
            return GetFromSource();
        }

        public void DiscardChanges()
        {
            Cache = GetFromSource();
            if (Cache == null)
                Cache = new FlowDocument();
        }

        public void Commit()
        {
            if (Cache != null)
            {
                /* else, no changes ... */

                var strm = Key["source"].BlobStream;
                strm.SetLength(0);
                strm.Position = 0;
                FormatProvider.ToStream(null, strm, Cache);
            }
        }

        public FlowDocument Source
        {
            get
            {
                if (Cache == null)
                {
                    DiscardChanges();
                }


                return Cache;
            }
            set
            {
                Cache = value;

                Commit();

                RaisePropertyChanged("Source");
            }
        }

        private FlowDocument GetFromSource()
        {
            if (Key.ReadOnly)
            {
                if (!Key.FieldExists("source"))
                    return null;
            }

            var blob = Key["source"].BlobStream;
            blob.Position = 0;
            return (FlowDocument)(FormatProvider.FromStream(null, blob));
        }
    }
}
